/*
 * Merger.h
 *
 *  Created on: 24/05/2013
 *      Author: jonathan
 */

#ifndef MERGER_H_
#define MERGER_H_
#include "../typedefs.hpp"
#include <string>
#include <map>
#include "archivos/ArchivoAuxiliar.h"
using namespace std;
class KeyMerge {
private:
	EntradaAuxiliar * entrada;
public:
	KeyMerge(EntradaAuxiliar * entrada);
	bool operator<(const KeyMerge& rhs) const;
	EnteroLargo getDoc() const;
	string getTermino() const;
	EntradaAuxiliar * getEntrada();
};

class ContadorMerge {
private:
	EnteroLargo cont;
	ArchivoAuxiliar * arch;
public:
	ContadorMerge(ArchivoAuxiliar * aux);
	virtual ~ContadorMerge();
	ContadorMerge& operator++();
	ContadorMerge& operator--();
    ArchivoAuxiliar *getArch() const;
    EnteroLargo getCont() const;
    void setArch(ArchivoAuxiliar *arch);
    void setCont(EnteroLargo cont);
};


class Merger {
private:
	FileName entrada;
	FileName prefEntrada;
	FileName extEntrada;
	EnteroLargo cantidad;
	string nombreSalida(FileName prefijo, EnteroLargo nro);
	string nombreEntrada(FileName prefijoEnt, EnteroLargo nro);
	void hacerLectura(ContadorMerge*,EnteroLargo cant, map<KeyMerge,ContadorMerge*>&);
	void procesarParcial(EnteroLargo inicial, EnteroLargo cantidad, FileName prefijoEnt, FileName prefijoSal, EnteroLargo nro);
public:
	Merger(FileName entrada, FileName prefEntrada, FileName extEntrada,
			EnteroLargo cantidad);
	EnteroLargo procesar();
};

#endif /* MERGER_H_ */
